package com.adminserver.util.HandlerException;

import cn.dev33.satoken.exception.DisableLoginException;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import com.adminserver.util.responseUtil.ResponseEnum;
import com.adminserver.util.responseUtil.ResponseUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler;

@Component
public class HandlerException {

    // 全局异常拦截（拦截项目中的NotLoginException异常）
    @ExceptionHandler(NotLoginException.class)
    public String handlerNotLogin(NotLoginException nle) {
        System.out.println("\033[36;4m" + "====================>全局异常拦截（拦截项目中的登录异常）<====================" + "\033[0;0m");
        // 打印堆栈，以供调试
        //nle.printStackTrace();

        // 判断场景值，定制化异常信息
        if (nle.getType().equals(NotLoginException.NOT_TOKEN)) {
            return ResponseUtil.setE(ResponseEnum.LOGIN_FAILURE).toJSONString();
        } else if (nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
            return ResponseUtil.setE(ResponseEnum.LOGIN_FAILURE).toJSONString();
        } else if (nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
            return ResponseUtil.setE(ResponseEnum.LOGIN_FAILURE).toJSONString();
        } else if (nle.getType().equals(NotLoginException.BE_REPLACED)) {
            return ResponseUtil.setE(ResponseEnum.BE_REPLACED).toJSONString();
        } else if (nle.getType().equals(NotLoginException.KICK_OUT)) {
            return ResponseUtil.setE(ResponseEnum.KICK_OUT).toJSONString();
        } else {
            return ResponseUtil.setE(ResponseEnum.FAIL).toJSONString();
        }
    }

    @ExceptionHandler
    public String handlerRolePermission(Exception e) {
        System.out.println("\033[36;4m" + "====================>全局异常拦截（拦截项目中的权限异常）<====================" + "\033[0;0m");
        // 打印堆栈，以供调试
        //e.printStackTrace();

        // 不同异常返回不同状态码
        if (e instanceof NotLoginException) {    // 如果是未登录异常
            NotLoginException ee = (NotLoginException) e;
            return ResponseUtil.setE(ResponseEnum.LOGIN_FAILURE).toJSONString();
        } else if (e instanceof NotRoleException) {        // 如果是角色异常
            NotRoleException ee = (NotRoleException) e;
            return ResponseUtil.setE(ResponseEnum.NO_PERMISSION).toJSONString();
        } else if (e instanceof NotPermissionException) {    // 如果是权限异常
            NotPermissionException ee = (NotPermissionException) e;
            return ResponseUtil.setE(ResponseEnum.NO_PERMISSION).toJSONString();
        } else if (e instanceof DisableLoginException) {    // 如果是被封禁异常
            DisableLoginException ee = (DisableLoginException) e;
            return ResponseUtil.setE(ResponseEnum.NO_PERMISSION).toJSONString();
        } else {    // 普通异常, 输出：500 + 异常信息
            return ResponseUtil.setE(ResponseEnum.NO_PERMISSION).toJSONString();
        }
    }
}
